#include <iostream>
#include <iterator>
#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <forward_list>

using namespace std;

template<typename Iter>
static void alg(Iter it, bidirectional_iterator_tag) {
	cout << "alg() called for bidirectional iterator" << endl;
}

template<typename Iter>
static void alg(Iter it, random_access_iterator_tag) {
	cout << "alg() called for random access iterator" << endl;
}

template<typename Iter>
static void alg(Iter it, forward_iterator_tag) {
	cout << "alg() called for forward iterator" << endl;
}

template<typename Iter>
static void alg(Iter it, output_iterator_tag) {
	cout << "alg() called for output iterator" << endl;
}

template<typename Iter>
static void alg(Iter it) {
	alg(it, typename Iter::iterator_category());
}

int main(int argc, char** argv) {
	vector<int> v;
	list<int> l;
	map<int, int> m;
	set<int> s;
	deque<int> d;
	forward_list<int> fl;
	vector<int>::iterator itv = v.begin();
	list<int>::iterator itl = l.begin();
	map<int, int>::iterator itm = m.begin();
	set<int>::iterator its = s.begin();
	deque<int>::iterator itd = d.begin();
	forward_list<int>::iterator itfl = fl.begin();
	front_insert_iterator<vector<int>> fiiv(v);
	cout << "Vector : ";
	alg(itv);
	cout << "List : ";
	alg(itl);
	cout << "Map : ";
	alg(itm);
	cout << "Set : ";
	alg(its);
	cout << "Deque : ";
	alg(itd);
	cout << "Forward list : ";
	alg(itfl);
	cout << "Front insert iterator :";
	alg(fiiv);
	return 0;
}

